package com.langshixiaobai.mqdemo.server.core;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.UUID;


@NoArgsConstructor
@AllArgsConstructor
@Data
//消息
//进行序列号，用于网络传输，JSON只能是文本类型，而序列化是二进制数据，传输数据范围更广
public class Message implements Serializable {
    //属性配置
    private BasicProperties basicMessage = new BasicProperties();
    //存放消息
    private byte[]body;


    //由于消息是存储在文件中，为了在大量数据中获取想要的消息，通过begin-end进行记录，来获取消息
    //表示区间 [beginOffset， endOffset) 左闭右开
    //开始偏移量
    //不需要序列化
    //只在内存中存储方便知道硬盘中对应消息存储/取出的位置，而硬盘中消息不需要存储偏移量，因为存储后位置固定
    private transient long beginOffset = 0;
    //结束偏移量
    private transient long endOffset = 0;

    //是否有效，0x1 有效 0x0 无效
    //使用byte是由于数据存储在文件中，所以采用字节数进行记录
    //如果用boolean类型，无法保证记录到文件中，字节数大小
    private byte isValid = 0x1;

    //创建消息对象
    public static Message createMessage(String routingKey, BasicProperties basicProperties, byte[] bytes ){
        Message message = new Message();
        if(basicProperties != null){
            //存储属性配置
            message.setBasicMessage(basicProperties);
        }
        //存储message 的routing key
        message.setRoutingKey(routingKey);
        //设置messageId 以m-开头的id 防止根后续id名称重合
        message.setMessageId("m-"+UUID.randomUUID());
        //存放消息
        message.setBody(bytes);
        //返回message对象
        //由于这里是单纯内存创建对象，而beginOffset，endOffset 字段需要在存储消息到硬盘时
        //才会用到，所以刚开始创建时，没有设置这两个属性
        return message;
    }


    //获取messageId
    public String getMessageId(){
        return basicMessage.getMessageId();
    }
    //设置messageId
    public void setMessageId(String messageId){
        basicMessage.setMessageId(messageId);
    }
    public String getRoutingKey(){
        return basicMessage.getRoutingKey();
    }

    public void setRoutingKey(String routingKey){
        basicMessage.setRoutingKey(routingKey);
    }
    //获取是否持久化
    public Integer getDeliverMode(){
        return basicMessage.getDeliverMode();
    }
    //设置是否持久化
    public void setDeliverMode(Integer mode){
            basicMessage.setDeliverMode(mode);
    }


}
